package 数列.和为s的连续正数序列;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * TODO
 *
 * @className: lxzsxl
 * @description: TODO
 * @author: 等什么柠檬君
 * @date: 2022-04-27 21:47
 **/
public class lxzsxl {
    public static void main(String[] args) {
        int target = 15;

        System.out.println(Arrays.toString(findContinuousSequence(9)));
    }


    /**
     * 类似两数之和的思想 不过是两数的逆向操作
     * 两数是向内收缩
     * 此题为向外扩张
     * 物理效果类似毛毛虫蠕动的效果
     * @param target
     * @return
     */
    public static int[][] findContinuousSequence(int target) {

        ArrayList<int[]> arrayList = new ArrayList();
        //左指针
        int left = 1;
        //右指针
        int right = 2;
        //左右指针正常时进行迭代
        while (left < right){
            //高斯求和
            int sum = (left + right)*(right-left+1)/2;
            System.out.println(sum);
            //当区间内的和等于目标和时
            if (sum == target){
                //定义一个存值的数组
                int[] ints = new int[right-left+1];
                for (int i = 0; i < right-left+1; i++) {
                    ints[i] = left + i;
                }
                arrayList.add(ints);
                //因为该区间已经满足和要求,为了推动区间行动故左指针移动 这里不是为了缩小区间而是为了区间整体右移 即区间 [1,x] -> [2,x]
                ++left;
            }
            if (sum < target){
                //如果区间和小于目标值 代表该区间无法满足区间要求 需要扩张所以右指针移动
                //即 [x,2] -> [x,3] 扩展一位
                //此时区间已经由于不满足目标值而得到了扩展
                ++right;
            }
            if (sum > target){
                //如果区间和大于目标值 则证明区间需要收缩 则右指针固定 左指针缩小
                ++left;
            }

        }


        return arrayList.toArray(new int[arrayList.size()][]);
    }
}
